﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncOrdTrabajoRecMercancia');
--- crear una nueva funcion
CREATE OR REPLACE FUNCTION "FuncOrdTrabajoRecMercancia"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codOrdTrabajo" character varying(16)
	,INOUT	"@codOrdTrabajoRecMercancia" CHARACTER VARYING(16)
	,INOUT	"@codMaeUnidadMedida" CHARACTER VARYING(8)
	,INOUT	"@codOperacionInterna" CHARACTER VARYING(32)
	,INOUT	"@fechaInicio" TIMESTAMP
	,INOUT	"@fechaFin" TIMESTAMP
	,INOUT	"@consignatario" CHARACTER VARYING(256)
	,INOUT	"@docTransporte" CHARACTER VARYING(128)
	,INOUT	"@manifiesto" CHARACTER VARYING(64)
	,INOUT	"@fechaManifiesto" DATE
	,INOUT	"@depositoAduana" CHARACTER VARYING(128)
	,INOUT	"@bultos" INTEGER 
	,INOUT	"@peso"  NUMERIC(18,2)
	,INOUT	"@observaciones" CHARACTER VARYING(256)
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
	Auxiliar2 TEXT;
BEGIN

	/*SELECT BY ID*/
	IF "@OP"='selectById' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOrdTrabajoRecMercancia","codMaeUnidadMedida","codOperacionInterna","fechaInicio","fechaFin","consignatario","docTransporte","manifiesto","fechaManifiesto","depositoAduana","bultos","peso","observaciones"
		FROM	"OrdTrabajoRecMercancia"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY ID OT*/
	IF "@OP"='selectByIdOrdTrabajo' THEN
		-- obtengo el codigo de la Orden de trabajo
		Auxiliar=(select "codOrdTrabajo" from "OrdTrabajo" where id="@id");
		
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOrdTrabajoRecMercancia","codMaeUnidadMedida","codOperacionInterna","fechaInicio","fechaFin","consignatario","docTransporte","manifiesto","fechaManifiesto","depositoAduana","bultos","peso","observaciones"
		FROM	"OrdTrabajoRecMercancia"
		WHERE	"codOrdTrabajo"=Auxiliar;
	RETURN;
	END IF;

	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOrdTrabajoRecMercancia","codMaeUnidadMedida","codOperacionInterna",
		"fechaInicio","fechaFin","consignatario","docTransporte","manifiesto","fechaManifiesto","depositoAduana","bultos","peso","observaciones"
		FROM	"OrdTrabajoRecMercancia";
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN
		/*
		--- Verifico que no exista esa relacion
		IF EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" WHERE "codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia") THEN
			Auxiliar = 'ya existe un reconocimiento de mercancia con el codigo "' || "@codOrdTrabajoRecMercancia" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		*/

		/*
		IF trim("@consignatario")='' THEN
			Auxiliar = 'El Consignatario indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		*/

		IF "@fechaInicio">"@fechaFin" THEN
			Auxiliar = 'La fecha Inicial NO puede ser posterior a la Final, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		IF trim("@docTransporte")='' THEN
			Auxiliar = 'El doc. de Transporte indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF trim("@manifiesto")='' THEN
			Auxiliar = 'El Manifiesto indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF trim("@depositoAduana")='' THEN
			Auxiliar = 'El Deposito de aduana indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista la unidad de medida
		IF NOT EXISTS (SELECT 1 FROM "MaeUnidadMedida" WHERE "codMaeUnidadMedida"="@codMaeUnidadMedida") THEN
			Auxiliar = 'La Unidad de Medida indicado NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que la unidad de medida este activa
		IF NOT EXISTS (SELECT 1 FROM "MaeUnidadMedida" WHERE "codMaeUnidadMedida"="@codMaeUnidadMedida" and activo=true) THEN
			Auxiliar = 'La Unidad de Medida indicada NO SE ENCUENTRA ACTIVA, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		-- Obtengo el consecutivo
		-- Auxiliar = "FuncSeguridadConsecutivo"('getNextConsecutivo','OrdTrabajoRecMercancia');
		---  el usuario solicito que el codigo del reconocimiento sea el mismo de la OT
		Auxiliar = "@codOrdTrabajo";

		--- obtengo el consignatario
		--select "codMaeCliente2" into Auxiliar2 FROM "OrdTrabajo" WHERE "codOrdTrabajo"="@codOrdTrabajo";
		
		-- Grabo el registro
		INSERT INTO "OrdTrabajoRecMercancia" ("usuarioGrab","usuarioUltMod","activo","codOrdTrabajo","codOrdTrabajoRecMercancia","codMaeUnidadMedida","codOperacionInterna","fechaInicio","fechaFin","consignatario","docTransporte","manifiesto","fechaManifiesto","depositoAduana","bultos","peso","observaciones")
		VALUES	 ("@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE),"@codOrdTrabajo",Auxiliar,"@codMaeUnidadMedida","@codOperacionInterna","@fechaInicio","@fechaFin","@consignatario","@docTransporte","@manifiesto","@fechaManifiesto","@depositoAduana","@bultos","@peso","@observaciones");

		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOrdTrabajoRecMercancia","codMaeUnidadMedida","codOperacionInterna","fechaInicio","fechaFin","consignatario","docTransporte","manifiesto","fechaManifiesto","depositoAduana","bultos","peso","observaciones"
		FROM	"OrdTrabajoRecMercancia"
		ORDER BY id DESC LIMIT 1;

	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	IF "@OP"='update' THEN

		--- Si tiene Items asociado no puede ser editada
		IF 
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItem" WHERE "codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia") 
			AND
			EXISTS (
				SELECT 1 
				FROM "OrdTrabajoRecMercancia" 
				WHERE 
					id="@id" 
					AND 
					(
					"codMaeUnidadMedida"<>"@codMaeUnidadMedida"
					OR "codMaeUnidadMedida"<>"@codMaeUnidadMedida"
					OR "codOperacionInterna"<>"@codOperacionInterna"
					OR "fechaInicio"<>"@fechaInicio"
					OR "fechaFin"<>"@fechaFin"
					OR "consignatario"<>"@consignatario"
					OR "docTransporte"<>"@docTransporte"
					OR "manifiesto"<>"@manifiesto"
					OR "fechaManifiesto"<>"@fechaManifiesto"
					OR "depositoAduana"<>"@depositoAduana"
					OR "bultos"<>"@bultos"
					OR "peso"<>"@peso"
					OR "observaciones"<>"@observaciones"
					) 
				)	
			
		THEN
			Auxiliar = 'Debe eliminar los Items del Reconocimiento de Mercancia para editar los datos de cabecera.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		/*
		IF trim("@consignatario")='' THEN
			Auxiliar = 'El Consignatario indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		*/

		IF "@fechaInicio">"@fechaFin" THEN
			Auxiliar = 'La fecha Inicial NO puede ser posterior a la Final, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		IF trim("@docTransporte")='' THEN
			Auxiliar = 'El doc. de Transporte indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF trim("@manifiesto")='' THEN
			Auxiliar = 'El Manifiesto indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF trim("@depositoAduana")='' THEN
			Auxiliar = 'El Deposito de aduana indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista  con ese CODIGO
		IF EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" WHERE "codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia" and id<>"@id") THEN
			Auxiliar = 'ya existe un reconocimiento de mercancia con el codigo "' || "@codOrdTrabajoRecMercancia" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista la unidad de medida
		IF NOT EXISTS (SELECT 1 FROM "MaeUnidadMedida" WHERE "codMaeUnidadMedida"="@codMaeUnidadMedida") THEN
			Auxiliar = 'La Unidad de Medida indicado NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que la unidad de medida este activa
		IF NOT EXISTS (SELECT 1 FROM "MaeUnidadMedida" WHERE "codMaeUnidadMedida"="@codMaeUnidadMedida" and activo=true) THEN
			Auxiliar = 'La Unidad de Medida indicada NO SE ENCUENTRA ACTIVA, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"OrdTrabajoRecMercancia" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codOrdTrabajo"="@codOrdTrabajo"
			,"codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia"
			,"codMaeUnidadMedida"="@codMaeUnidadMedida"
			,"codOperacionInterna"="@codOperacionInterna"
			,"fechaInicio"="@fechaInicio"
			,"fechaFin"="@fechaFin"
			,"consignatario"="@consignatario"
			,"docTransporte"="@docTransporte"	
			,"manifiesto"="@manifiesto"			
			,"fechaManifiesto"="@fechaManifiesto"			
			,"depositoAduana"="@depositoAduana"			
			,"bultos"="@bultos"			
			,"peso"="@peso"	
			,"observaciones"="@observaciones"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;

	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- Borro el registro
		DELETE FROM "OrdTrabajoRecMercancia" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

